<?php

/**
 * IdGenerator类
 * 功能：唯一ID生成器
 * 
 * @version 1.0.0 2019/03/12
 * @since
 *
 */

namespace Lib\Service;

use Lib\Base\Common;
use Lib\Base\Validate;
use Lib\Cache\RedisAction;

class IdGenerator
{
    /**
     * 根据用户账号生成一个邀请码，同一个账号每次请求，生成邀请码不同
     * @param string|int $iUin,用户账号，可以是openid，也可以是QQ号
     * @param int $codeNum 需要生成的邀请码数量
     * @return string|array 邀请码，由0-9a-zA-Z组成，长度不固定，调用方需要自己保存邀请码
     * 如果是一次性生成多个邀请码，则返回一个一维数组，下标从0开始的数字，值为邀请码
     */

    public function getUid1($iUin, $codeNum = 1)
    {
        if (empty($iUin)) {
            return false;
        }

        if (Validate::checkNaturalNum($iUin)) {
            $hashNum = $iUin;
        } else {
            $hashNum = Common::time33($iUin);
        }

        $redis = new RedisAction();
        $maxNum = 6 * $codeNum;
        $randNum = $codeNum == 1 ? rand(1, 5) : $maxNum;
        $incrNum = $redis->incr(IDGENERATOR_IVTCODE_KEY1, $randNum);
        if ($codeNum == 1) {
            return Common::number2Base62($hashNum . $incrNum);
        } else {
            $rtnCode = [];
            $step = 6;
            $start = $incrNum - $randNum + 1;
            for ($i = $start; $i <= $incrNum; $i = $i + $step) {
                $rtnCode[] = Common::number2Base62($hashNum . $i);
                if (count($rtnCode) == $codeNum) {
                    break;
                }
            }
            return $rtnCode;
        }
    }

    /**
     * 生成长度11位的邀请码
     * 第1位：A-Z随机一个大写字符
     * 第2-11位：固定长度的数字
     * @return string 邀请码，每次调用结果都不同，全局唯一，调用方需要自己保存邀请码
     */
    public function getUid2()
    {
        $redis = new RedisAction();

        $incrNum = $redis->incr(IDGENERATOR_IVTCODE_KEY2, rand(1, 5));
        $len = strlen($incrNum);
        $num = substr('1000000000', 0, -$len) . $incrNum;
        $code = chr(rand(65, 90)) . (string) $num;
        return $code;
    }
}
